#include "mgr/MsgSender.h"
#include "mgr/WorkerMgr.h"
#include "mgr/HttpMgr.h"
#include "mgr/LogMgr.h"
#include "mgr/ImgWriterMgr.h"

int main(int argc, char* argv[])
{
	if(LogMgr::instance().Init("")){
		std::cout << "LogMgr Init Fail" << std::endl;
		exit(-1);
	}
	if (ImgWriterMgr::instance().Init("./config/config_worker.json")) {
		std::cout << "ImgWriterMgr Init Fail" << std::endl;
		exit(-1);
	}
	if (MsgSender::instance().Init("./config/config_worker.json")) {
		std::cout << "MsgSender Init Fail" << std::endl;
		exit(-1);
	}
	if (WorkerMgr::instance().Init("./config/config_worker.json")) {
		std::cout << "WorkerMgr Init Fail" << std::endl;
		exit(-1);
	}
	if (HttpMgr::instance().Init("./config/config_http.json")) {
		std::cout << "HttpMgr Init Fail" << std::endl;
		exit(-1);
	}
	LogMgr::instance().Run();
	std::cout << "LogMgr Start Running" <<  std::endl;

	ImgWriterMgr::instance().Run();
	std::cout << "ImgWriterMgrs Start Running" <<  std::endl;

	MsgSender::instance().Run();
	std::cout << "MsgSender Start Running" <<  std::endl;
	
	WorkerMgr::instance().Run();
	std::cout << "WorkerMgr Start Running" <<  std::endl;

	HttpMgr::instance().Run();
	std::cout << "HttpMgr Start Running" <<  std::endl;
	// 测试一下 直接跑
	
	while (true)
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	}
	std::cout << "Finish" <<  std::endl;
	
	return 0;
}

// #include <iostream>

// #include "opencv2/opencv_modules.hpp"


// #include <string>
// #include <vector>
// #include <algorithm>
// #include <numeric>

// #include <opencv2/core.hpp>
// #include <opencv2/core/opengl.hpp>
// #include <opencv2/cudacodec.hpp>
// #include <opencv2/highgui.hpp>

// int main(int argc, const char* argv[])
// {
//     const std::string fname("rtsp://admin:hw123456@10.0.14.102:554/main_stream");

//     cv::Mat frame;
//     cv::VideoCapture reader(fname);

//     cv::cuda::GpuMat d_frame;
//     cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(fname);

//     cv::TickMeter tm;
//     std::vector<double> cpu_times;
//     std::vector<double> gpu_times;

//     int gpu_frame_count=0, cpu_frame_count=0;

//     for (int i = 0; i < 100; i++)
//     {
//         tm.reset(); tm.start();
//         if (!reader.read(frame))
//             break;
//         tm.stop();
//         cpu_times.push_back(tm.getTimeMilli());
//         cpu_frame_count++;

//         if (cv::waitKey(3) > 0)
//             break;
//     }

//     for (int i = 0; i < 100; i++)
//     {
//         tm.reset(); tm.start();
//         if (!d_reader->nextFrame(d_frame))
//             break;
//         d_frame.download(frame);
//         tm.stop();
//         gpu_times.push_back(tm.getTimeMilli());
//         gpu_frame_count++;

//         if (cv::waitKey(3) > 0)
//             break;
//     }

//     if (!cpu_times.empty() && !gpu_times.empty())
//     {
//         std::cout << std::endl << "Results:" << std::endl;

//         std::sort(cpu_times.begin(), cpu_times.end());
//         std::sort(gpu_times.begin(), gpu_times.end());

//         double cpu_avg = std::accumulate(cpu_times.begin(), cpu_times.end(), 0.0) / cpu_times.size();
//         double gpu_avg = std::accumulate(gpu_times.begin(), gpu_times.end(), 0.0) / gpu_times.size();

//         std::cout << "CPU : Avg : " << cpu_avg << " ms FPS : " << 1000.0 / cpu_avg << " Frames " << cpu_frame_count << std::endl;
//         std::cout << "GPU : Avg : " << gpu_avg << " ms FPS : " << 1000.0 / gpu_avg << " Frames " << gpu_frame_count << std::endl;
//     }

//     return 0;
// }